#Load packages

library(data.table)
library(tidyr)
library(haven)
library(ggplot2)
library(dplyr)
library(gridExtra)
library(lmtest)
library(maps)
library(mapdata)
library(readxl)

#Add data GPS

gps_data <- haven::read_dta("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/GPS_dataset_individual_level/individual_new.dta")

head(country_data)

Clean the data from missing values

# Clean the data by removing records with missing values
cleaned_data <- gps_data %>%
  drop_na(country, isocode, risktaking, gender, age)

# Calculate the number of records removed per variable
records_removed_per_variable <- colSums(is.na(gps_data)) - colSums(is.na(cleaned_data))

# Display the cleaned data
cleaned_data

# Display the number of records removed per variable
records_removed_per_variable
         country          isocode             ison           region         language             date 
               0                0                0                0                0                0 
       id_gallup              wgt         patience       risktaking         posrecip         negrecip 
               0                0              190              634               32              247 
        altruism            trust subj_math_skills           gender              age 
              74              163              132                0              276 

List of all variable

# List all variables
variable_list <- names(cleaned_data) 

# Display the list of variables
print(variable_list)
 [1] "country"          "isocode"          "ison"             "region"           "language"        
 [6] "date"             "id_gallup"        "wgt"              "patience"         "risktaking"      
[11] "posrecip"         "negrecip"         "altruism"         "trust"            "subj_math_skills"
[16] "gender"           "age"             

#select only the variables of interest

cleaned_data <- cleaned_data %>%
  select(country, isocode, ison, risktaking, gender, age)
cleaned_data

Calculate Z-Score for Age per Country

cleaned_data <- cleaned_data %>%
  group_by(country) %>%
  mutate(z_score_age = scale(age))

# Display the new column with Z-Scores per Country
head(cleaned_data)

Create a new column “age_group” with the age categories

cleaned_data$agecat <- cut(
  cleaned_data$age,
  breaks = c(15, 20, 30, 40, 50, 60, 70, 80, Inf), # The category boundaries
  labels = c("15-19", "20-29", "30-39", "40-49", "50-59", "60-69", "70-79", "80+"), # The category labels
  right = FALSE # Left end (inclusive), right end (exclusive)
)

# Display the new column
head(cleaned_data)

Calculate the the mean and add column

# Calculate mean values for risktaking, gender, and age per country
country_means <- cleaned_data %>%
  group_by(country) %>%
  summarize(
    mean_risktaking = mean(risktaking, na.rm = TRUE),
    mean_gender = mean(gender, na.rm = TRUE),
    mean_age = mean(age, na.rm = TRUE), 
    mean_z_score_age = mean(z_score_age, na.rm = TRUE),
  )

# Merge mean values back to the original dataset
cleaned_data <- merge(cleaned_data, country_means, by = "country", all.x = TRUE)

# Display the updated dataset
head(cleaned_data)
NA

#Hardship-list

excel_path <- "/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/Hardship/Hardship.xlsx"

hardship_values <- read_excel(excel_path) # Read data from the Excel file
New names:
print(colnames(cleaned_data)) # Display column names in cleaned_data
 [1] "country"          "isocode"          "ison"             "risktaking"       "gender"          
 [6] "age"              "z_score_age"      "agecat"           "mean_risktaking"  "mean_gender"     
[11] "mean_age"         "mean_z_score_age"
print(colnames(hardship_values)) # Display column names in hardship_data
[1] "country"          "mean_homicide"    "gdp"              "gini"             "Infant_mortality"
[6] "life_expect"      "hardship"         "...8"            
cleaned_data <- left_join(cleaned_data, hardship_values, by = "country") # Perform the left_join operation

head(cleaned_data) # Display the updated dataset

#select only the variables of interest

gps_country <- cleaned_data %>%
  select(country, isocode, ison, mean_risktaking, mean_gender, mean_age, mean_z_score_age, hardship)
gps_country

Calculate mean values for risktaking, gender, and age per country

#select only the variables of interest
gps_country <- cleaned_data %>%
  group_by(country) %>%
  summarize(
    isocode = first(isocode),
    ison = first(ison),
    mean_risktaking = mean(risktaking, na.rm = TRUE),
    mean_gender = mean(gender, na.rm = TRUE),
    mean_age = mean(age, na.rm = TRUE),
    hardship = first(hardship)
  ) %>%
  ungroup()

gps_country

Descriptive

Number of courtries after data cleaning

# Determine the number of different countries
number_of_countries <- length(unique(cleaned_data$country))

# Display the number of different countries
number_of_countries
[1] 76

#CODE FOR THE PRESENTATION ########### ########## ##########

Worldmap of the recorded countries

world_map <- map_data("world") # Create a world map with country borders

recorded_countries <- unique(cleaned_data$country) # Get the list of recorded countries from your cleaned_data

world_map$recorded <- ifelse(world_map$region %in% recorded_countries, "Recorded", "Not Recorded") # Create a new variable indicating whether a country has been recorded or not

# Plot the world map with recorded countries highlighted
ggplot(world_map, aes(x = long, y = lat, group = group, fill = recorded)) +
  geom_polygon(color = "white") +
  scale_fill_manual(values = c("Recorded" = "darkblue", "Not Recorded" = "lightgrey"), guide = "none") +  # Set guide to "none" to remove the legend
  theme_void() +
  labs(title = "GPS", fill = "Status") +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))  # Remove legend and center the title

All about the age

# Age Range
age_min <- min(cleaned_data$age, na.rm = TRUE)
age_max <- max(cleaned_data$age, na.rm = TRUE)

# Average Age
average_age <- mean(cleaned_data$age, na.rm = TRUE)

# Median Age
median_age <- median(cleaned_data$age, na.rm = TRUE)

# Display the age statistics
cat("Age Range: ", age_min, " to ", age_max, "\n")
Age Range:  15  to  99 
cat("Average Age: ", average_age, "\n")
Average Age:  41.73605 
cat("Median Age: ", median_age, "\n")
Median Age:  40 

Number of participants in each age category

# number of participants in each age category
agecat_counts <- table(cleaned_data$agecat)

# Display the number of participants in the age categories
print(agecat_counts)

15-19 20-29 30-39 40-49 50-59 60-69 70-79   80+ 
 6888 16872 15905 13583 11374  8570  4688  1559 

Boxplot of Age Distribution per Country

ggplot(cleaned_data, aes(x = age)) +
  geom_histogram(binwidth = 0.5, fill = "lightblue", color = "blue") +
  labs(x = "Age", y = "Frequency", title = "Histogram of Age Distributionn") +
  theme_minimal()


ggplot(cleaned_data, aes(x = country, y = age)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Distribution of Age per Country", x = "Country", y = "Age") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))


ggplot(cleaned_data, aes(x = country, y = risktaking)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Distribution of Age per Country", x = "Country", y = "Risktaking") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

All about the gender

# Calculate the counts of females (gender = 1) and males (gender = 2)
gender_counts <- table(cleaned_data$gender)

# Display the counts
cat("Number of Females: ", gender_counts[1], "\n")
Number of Females:  36024 
cat("Number of Males: ", gender_counts[2], "\n")
Number of Males:  43415 

Table with country and gender

# Create a table that breaks down the number of participants by country and gender
gender_by_country <- xtabs(~ country + gender, data = cleaned_data)

# Rename columns and rows for better readability
colnames(gender_by_country) <- c("Female", "Male")
rownames(gender_by_country) <- unique(cleaned_data$country)

# Calculate the total participants by summing the rows
total_participants <- rowSums(gender_by_country)

# Create a data frame with country, total participants, female, and male
result_table <- data.frame(
  country = rownames(gender_by_country),
  total_participants = total_participants,
  female = gender_by_country[, "Female"],
  male = gender_by_country[, "Male"]
)

# Display the result table
result_table

Analysis of item risktaking

# Summary statistics for risktaking
risk_summary <- summary(cleaned_data$risktaking)

# Histogram of risktaking
ggplot(cleaned_data, aes(x = risktaking)) +
  geom_histogram(binwidth = 1, fill = "lightblue", color = "blue", alpha = 0.7) +
  labs(title = "Distribution of Risk-Taking", x = "Risk-Taking Score", y = "Frequency") +
  theme_minimal()


# Boxplot of risktaking by gender
ggplot(cleaned_data, aes(x = as.factor(gender), y = risktaking, fill = as.factor(gender))) +
  geom_boxplot() +
  labs(title = "Risk-Taking by Gender", x = "Gender", y = "Risk-Taking Score") +
  scale_x_discrete(labels = c("0" = "male", "1" = "female")) +
  theme_minimal() +
  guides(fill = FALSE)


# Risk vs age
ggplot(cleaned_data, aes(risktaking, age)) +
  geom_point(size = 0.2) +  
  geom_smooth(method = "lm")


# Boxplot of risktaking by age group
cleaned_data$age_group <- cut(cleaned_data$age, breaks = c(0, 25, 35, 45, 55, Inf),
                               labels = c("18-25", "26-35", "36-45", "46-55", "56+"))
ggplot(cleaned_data, aes(x = age_group, y = risktaking, fill = age_group)) +
  geom_boxplot() +
  labs(title = "Risk-Taking by Age Group", x = "Age Group", y = "Risk-Taking Score") +
  theme_minimal() +
  guides(fill = FALSE)


# Boxplot of risktaking by country
ggplot(cleaned_data, aes(x = country, y = risktaking)) +
  geom_boxplot(fill = "lightblue", color = "blue") +
  labs(title = "Risk-Taking by Country", x = "Country", y = "Risk-Taking Score") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))

FOR PRESENTATION #############################

Risk vs age with color-coded gender per Country

# Skalierung des Z-Scores für das Alter anpassen
cleaned_data$z_score_age_scaled <- 15 * cleaned_data$z_score_age + 42

# Risk vs age with color-coded gender per Country
ggplot(cleaned_data, aes(z_score_age_scaled, risktaking, color = factor(gender))) +
  geom_point(size = 0.1) +  
  geom_smooth(method = "lm") +
  geom_vline(xintercept = 42, linetype = "dashed", color = "black", size = 1) +  # Vertikale Linie für den Mittelwert
  scale_color_manual(values = c("blue", "red"), labels = c("Male", "Female")) +
  labs(color = "Gender") +
  ggtitle("Risk vs Age GPS") +
  xlab("Age (Mean = 42, SD = 15)") +
  scale_x_continuous(breaks = seq(0, 100, by = 15), limits = c(0, 100)) +  # Anpassung der Intervalle auf der X-Achse
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Risktaking vs. hardship across countries

# Risktaking vs. Hardship across countries with summarized points
ggplot(cleaned_data, aes(x = hardship, y = mean_risktaking)) +
  geom_point(aes(color = isocode), size = 3) +
  geom_text(aes(label = isocode), vjust = -0.5, hjust = 0.5, size = 3) +
  labs(title = "Risktaking vs. Hardship across Countries GPS",
       x = "Hardship", y = "Risktaking") +
  theme_minimal() +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

# Risktaking vs. Hardship across countries with summarized points
ggplot(cleaned_data, aes(x = hardship, y = mean_z_score_age)) +
  geom_point(aes(color = isocode), size = 3) +
  geom_text(aes(label = isocode), vjust = -0.5, hjust = 0.5, size = 3) +
  labs(title = "Risktaking vs. Age across Countries GPS",
       x = "Hardship", y = "Age") +
  theme_minimal() +
  theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

Scatterplot of the relationship between hardship index and age-effect estimates

model_age <- lm(hardship ~ mean_z_score_age, data = cleaned_data)
model_gender <- lm(hardship ~ gender, data = cleaned_data)
# Coefficients for age-effect
age_coefficients <- coef(model_age)

# Coefficients for gender-effect
gender_coefficients <- coef(model_gender)
# Skalierung des Z-Scores für das Alter anpassen
cleaned_data$z_score_age_scaled <- 15 * cleaned_data$mean_z_score_age + 42

# Scatterplot for age-effect
ggplot(cleaned_data, aes(x = mean_z_score_age, y = hardship)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "blue") +
  labs(title = "Scatterplot of Hardship vs Age",
       x = "Age", y = "Hardship") +
  theme_minimal()

Laura has to rewrite the code –> Table already included with the lm

# Fit das Modell mit "age"
model_gender <- lm(risktaking ~ age + gender, data = cleaned_data)

# Intercept and Slope for age
intercept_age <- coef(model)["(Intercept)"]
slope_age <- coef(model)["age"]

summary(model)

Call:
lm(formula = risktaking ~ age * gender, data = cleaned_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3288 -0.6770 -0.0426  0.6446  3.0662 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.6413392  0.0131258  48.861  < 2e-16 ***
age         -0.0124875  0.0002925 -42.692  < 2e-16 ***
gender      -0.1285097  0.0178148  -7.214 5.50e-13 ***
age:gender  -0.0021551  0.0003944  -5.464 4.66e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9644 on 79435 degrees of freedom
Multiple R-squared:  0.07001,   Adjusted R-squared:  0.06998 
F-statistic:  1993 on 3 and 79435 DF,  p-value: < 2.2e-16

Laura has to rewrite the code –> Table already included with the lm

Create a table with the following information: country, isocode, n (count of participants), female percentage (%), mean age, age range, and risktaking

Four loup

Group by country mutate intercept run and save intercept model

# Group the data by country
table_data <- gps_data %>%
  group_by(country, isocode) %>%
  summarize(
    n = n(),
    female_percentage = mean(gender == 1) * 100,
    mean_age = mean(age, na.rm = TRUE),
    age_range = paste(min(age, na.rm = TRUE), "-", max(age, na.rm = TRUE)),
    mean_risktaking = mean(risktaking, na.rm = TRUE)
  )
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
# Intercept and slope for age
intercept_age <- 0.5759701
slope_age <- -0.0137902

# Intercept and slope for gender
intercept_gender <- 0.124666 
slope_gender <- -0.227338 

# Add the intercept and slope information to the table
table_data <- table_data %>%
  mutate(
    intercept_age = intercept_age,
    slope_age = slope_age,
    intercept_gender = intercept_gender,
    slope_gender = slope_gender,
  )

# Display the updated table
table_data

#Preparing for linear regression

# Check for missing values in 'Country' and 'Risktaking' columns
missing_country <- anyNA(cleaned_data$country)
missing_risktaking <- anyNA(cleaned_data$risktaking)

# Print the results
cat("Missing values in 'Country': ", missing_country, "\n")
Missing values in 'Country':  FALSE 
cat("Missing values in 'Risktaking': ", missing_risktaking, "\n")
Missing values in 'Risktaking':  FALSE 
# Clean the data by removing records with missing values
cleaned_data <- gps_data %>%
  drop_na(country, risktaking, age)

# Split the data by country and perform linear regression for each country
regression_results <- cleaned_data %>%
  group_by(country) %>%
  do(model = lm(risktaking ~ age, data = .)) %>%
  summarize(
    country = first(country),
    intercept = summary(model)$coefficients[1],
    slope = summary(model)$coefficients[2],
    r_squared = summary(model)$r.squared
  )

# Display regression results for each country
print(regression_results)

analyze the results by using “Balkendiagramm”

what does 0 mean? // centered age = mean age of the sample
ggplot(data = regression_results, aes(x = country, y = intercept)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(title = "Intercepts for Risktaking by Country", x = "Country", y = "Intercept Value") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

View the countries with intercept values over 0.75

high_intercept_countries <- subset(regression_results, intercept > 0.75)

# View the countries with intercept values over 0.75
print(high_intercept_countries)

Scatterplots for ‘high_intercept_countries’ contains the top 17 countries

# Create scatterplots with regression lines for countries with intercept > 0.75
plots <- lapply(high_intercept_countries$country, function(country) {
  p <- ggplot(subset(cleaned_data, country == country), aes(x = age, y = risktaking, color = factor(gender))) +
    geom_point(size = 0.5) +
    geom_smooth(method = "lm", formula = y ~ x, se = FALSE) +
    labs(title = paste("Linear Regression for", country),
         subtitle = paste("Intercept:", round(high_intercept_countries$intercept[high_intercept_countries$country == country], 2)),
         color = "Gender") +
    scale_color_manual(values = c("0" = "blue", "1" = "red"), labels = c("Male", "Female"))
  print(p)
})


# Save the plots in a directory
dir.create("individual_country_plots", showWarnings = FALSE)
setwd("individual_country_plots")
Warning: The working directory was changed to /Users/laurabazzigher/Documents/GitHub/risk_wvs/code/individual_country_plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
for (i in seq_along(plots)) {
  filename <- paste0("plot_", i, ".png")
  ggsave(filename, plot = plots[[i]], width = 8, height = 6)
}


# Switch back to the original working directory
setwd("..")

print("Individual plots for countries with intercept > 0.75 are saved in the 'individual_country_plots' directory.")
[1] "Individual plots for countries with intercept > 0.75 are saved in the 'individual_country_plots' directory."

Scatterplots for ‘high_intercept_countries’ contains the top 17 countries

plots <- lapply(high_intercept_countries$country, function(country) {
  p <- ggplot(subset(cleaned_data, country == country), aes(x = ranking.x, y = risktaking, color = factor(gender))) +
    geom_point(size = 0.5) +
    geom_smooth(method = "lm", formula = y ~ x, se = FALSE) +
    labs(title = paste("Linear Regression for", country),
         subtitle = paste("Intercept:", round(high_intercept_countries$intercept[high_intercept_countries$country == country], 2)),
         color = "Gender") +
    scale_color_manual(values = c("0" = "blue", "1" = "red"), labels = c("Male", "Female"))
  print(p)
})
Error in `geom_point()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error:
! object 'ranking.x' not found
Backtrace:
  1. base::lapply(...)
  2. global FUN(X[[i]], ...)
  4. ggplot2:::print.ggplot(p)
  6. ggplot2:::ggplot_build.ggplot(x)
  7. ggplot2:::by_layer(...)
     ...
 15. l$compute_aesthetics(d, plot)
 16. ggplot2 (local) compute_aesthetics(..., self = self)
 17. ggplot2:::scales_add_defaults(...)
 18. base::lapply(aesthetics[new_aesthetics], eval_tidy, data = data)
 19. rlang (local) FUN(X[[i]], ...)

Create scatterplots with regression lines for individual countries

# Examples for countries
regression_results <- data.frame(
  country = c("Algeria", "Argentina", "Austria"),
  intercept = c(0.92053422, 0.51698822, 0.42606684),
  slope = c(-0.0146641801, -0.0115569623, -0.0108763042),
  r_squared = c(5.232529e-02, 5.638271e-02, 3.539810e-02    )
)

# Create scatterplots with regression lines for each country
plots <- lapply(seq_len(nrow(regression_results)), function(i) {
  country <- regression_results$country[i]
  intercept <- regression_results$intercept[i]
  slope <- regression_results$slope[i]
  r_squared <- regression_results$r_squared[i]
  
  p <- ggplot(subset(cleaned_data, country == country), aes(x = age, y = risktaking)) +
    geom_point() +
    geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "blue") +
    labs(title = paste("Linear Regression for", country),
         subtitle = paste("Intercept:", round(intercept, 2),
                           "Slope:", round(slope, 2),
                           "R-squared:", round(r_squared, 2)))
  print(p)
})


# Save the plots in a directory
dir.create("individual_country_plots", showWarnings = FALSE)
setwd("individual_country_plots")
Warning: The working directory was changed to /Users/laurabazzigher/Documents/GitHub/risk_wvs/code/individual_country_plots inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
for (i in seq_along(plots)) {
  filename <- paste0("plot_", i, ".png")
  ggsave(filename, plot = plots[[i]], width = 8, height = 6)
}


# Switch back to the original working directory
setwd("..")

print("Individual plots are saved in the 'individual_country_plots' directory.")
[1] "Individual plots are saved in the 'individual_country_plots' directory."

Scatterplot with include both individual country regression lines and an overall regression line

# Calculate the overall regression line
overall_lm <- lm(risktaking ~ age, data = cleaned_data)

# Create a scatterplot with separate regression lines for each country
# and an overall regression line
ggplot(cleaned_data, aes(x = age, y = risktaking, color = country)) +
  geom_point(size = 0.5) +                      # Adjust point size
  geom_smooth(method = "lm", se = FALSE, size = 0.5) + # Solid line for individual countries
  geom_abline(intercept = coef(overall_lm)[1], slope = coef(overall_lm)[2], 
              color = "black", size = 1) + # Add the overall regression line in red
  labs(title = "Scatterplot with Regression Lines for risktaking and age by Country", 
       x = "Age", y = "Risktaking") +
  theme(legend.position = "bottom",          # Move the legend below the graph
        legend.key.size = unit(0.1, "in"))  # Adjust the size of the legend key

Combined List of all 3 files

Prepare Wave 5

# Load the data
WV5_data <- readRDS("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/F00007944-WV5_Data_R_v20180912.rds") # Data of Wave 5

#rename the variables
WV5_data <- WV5_data_df %>%
  rename(sex = V235, age = V237, country = V2, wave = V1, risktaking = V86)
WV5_data

#select only the variables of interest
WV5_data <- WV5_data %>%
  select(sex, age, country, wave, risktaking)
WV5_data

#decode the country names 
countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV5_data$country_lab = countrynames$name [match(WV5_data$country, countrynames$code)]
table(WV5_data$country_lab)
WV5_data

Prepare Wave 6

#Read Dataset (Wave 6)
WV6_data <- load("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/WV6_Data_R_v20201117.rdata") 
WV6_data <- WV6_Data_R_v20201117 
print(WV6_data)

#rename variables in Wave 6

WV6_data <- WV6_data %>%
  rename(wave = V1, sex = V240, age = V242,country = V2, risktaking = V76)

#select only the variables of interest
WV6_data <- WV6_data %>%
  select(wave, sex, age, country, sex,risktaking)
WV6_data

#decode daraset (Wave 6)

countrynames = read.csv("/Users/laurabazzigher/Documents/GitHub/risk_wvs/data/dataset/WV6_dataset_wave_5_6/countrynames.txt", header=FALSE,as.is=TRUE)
colnames(countrynames) = c("code", "name")
WV6_data$country_lab = countrynames$name [match(WV6_data$country, countrynames$code)]
table(WV6_data$country_lab)
WV6_data

Prepare GPS dataset (cleaned_data)

# Rename "Country" in "country_lab"
print(colnames(cleaned_data))

#combine the 2 dataset (Wave 6 + Wave 5)

WV5_data
WV6_data
data = rbind(WV5_data, WV6_data)
data

#number of countries

length(unique(data$country_lab))

Merge the datasets based on common variables

# Find common countries between the two datasets
common_countries <- intersect(data$country_lab, cleaned_data$country)

# Display the common countries
print(common_countries)

Find countries in “data” but not in “cleaned_data”

countries_only_in_data <- setdiff(data$country_lab, cleaned_data$country)

# Find countries in "cleaned_data" but not in "data"
countries_only_in_cleaned_data <- setdiff(cleaned_data$country, data$country_lab)

# Display the results
cat("Countries only in 'data':", countries_only_in_data, "\n")
cat("Countries only in 'cleaned_data':", countries_only_in_cleaned_data, "\n")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI0xvYWQgcGFja2FnZXMKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShoYXZlbikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkobWFwcykKbGlicmFyeShtYXBkYXRhKQpsaWJyYXJ5KHJlYWR4bCkKYGBgCgojQWRkIGRhdGEgR1BTCmBgYHtyfQpncHNfZGF0YSA8LSBoYXZlbjo6cmVhZF9kdGEoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9HUFNfZGF0YXNldF9pbmRpdmlkdWFsX2xldmVsL2luZGl2aWR1YWxfbmV3LmR0YSIpCgpoZWFkKGNvdW50cnlfZGF0YSkKYGBgCgojIENsZWFuIHRoZSBkYXRhIGZyb20gbWlzc2luZyB2YWx1ZXMKYGBge3J9CiMgQ2xlYW4gdGhlIGRhdGEgYnkgcmVtb3ZpbmcgcmVjb3JkcyB3aXRoIG1pc3NpbmcgdmFsdWVzCmNsZWFuZWRfZGF0YSA8LSBncHNfZGF0YSAlPiUKICBkcm9wX25hKGNvdW50cnksIGlzb2NvZGUsIHJpc2t0YWtpbmcsIGdlbmRlciwgYWdlKQoKIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbW92ZWQgcGVyIHZhcmlhYmxlCnJlY29yZHNfcmVtb3ZlZF9wZXJfdmFyaWFibGUgPC0gY29sU3Vtcyhpcy5uYShncHNfZGF0YSkpIC0gY29sU3Vtcyhpcy5uYShjbGVhbmVkX2RhdGEpKQoKIyBEaXNwbGF5IHRoZSBjbGVhbmVkIGRhdGEKY2xlYW5lZF9kYXRhCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiByZWNvcmRzIHJlbW92ZWQgcGVyIHZhcmlhYmxlCnJlY29yZHNfcmVtb3ZlZF9wZXJfdmFyaWFibGUKYGBgCgojIExpc3Qgb2YgYWxsIHZhcmlhYmxlCmBgYHtyfQojIExpc3QgYWxsIHZhcmlhYmxlcwp2YXJpYWJsZV9saXN0IDwtIG5hbWVzKGNsZWFuZWRfZGF0YSkgCgojIERpc3BsYXkgdGhlIGxpc3Qgb2YgdmFyaWFibGVzCnByaW50KHZhcmlhYmxlX2xpc3QpCmBgYAojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApgYGB7cn0KY2xlYW5lZF9kYXRhIDwtIGNsZWFuZWRfZGF0YSAlPiUKICBzZWxlY3QoY291bnRyeSwgaXNvY29kZSwgaXNvbiwgcmlza3Rha2luZywgZ2VuZGVyLCBhZ2UpCmNsZWFuZWRfZGF0YQpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIENhbGN1bGF0ZSBaLVNjb3JlIGZvciBBZ2UgcGVyIENvdW50cnkKYGBge3J9CmNsZWFuZWRfZGF0YSA8LSBjbGVhbmVkX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgbXV0YXRlKHpfc2NvcmVfYWdlID0gc2NhbGUoYWdlKSkKCiMgRGlzcGxheSB0aGUgbmV3IGNvbHVtbiB3aXRoIFotU2NvcmVzIHBlciBDb3VudHJ5CmhlYWQoY2xlYW5lZF9kYXRhKQpgYGAKCgojIENyZWF0ZSBhIG5ldyBjb2x1bW4gImFnZV9ncm91cCIgd2l0aCB0aGUgYWdlIGNhdGVnb3JpZXMKYGBge3J9CmNsZWFuZWRfZGF0YSRhZ2VjYXQgPC0gY3V0KAogIGNsZWFuZWRfZGF0YSRhZ2UsCiAgYnJlYWtzID0gYygxNSwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIEluZiksICMgVGhlIGNhdGVnb3J5IGJvdW5kYXJpZXMKICBsYWJlbHMgPSBjKCIxNS0xOSIsICIyMC0yOSIsICIzMC0zOSIsICI0MC00OSIsICI1MC01OSIsICI2MC02OSIsICI3MC03OSIsICI4MCsiKSwgIyBUaGUgY2F0ZWdvcnkgbGFiZWxzCiAgcmlnaHQgPSBGQUxTRSAjIExlZnQgZW5kIChpbmNsdXNpdmUpLCByaWdodCBlbmQgKGV4Y2x1c2l2ZSkKKQoKIyBEaXNwbGF5IHRoZSBuZXcgY29sdW1uCmhlYWQoY2xlYW5lZF9kYXRhKQpgYGAKIyBDYWxjdWxhdGUgdGhlIHRoZSBtZWFuIGFuZCBhZGQgY29sdW1uCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFuIHZhbHVlcyBmb3Igcmlza3Rha2luZywgZ2VuZGVyLCBhbmQgYWdlIHBlciBjb3VudHJ5CmNvdW50cnlfbWVhbnMgPC0gY2xlYW5lZF9kYXRhICU+JQogIGdyb3VwX2J5KGNvdW50cnkpICU+JQogIHN1bW1hcml6ZSgKICAgIG1lYW5fcmlza3Rha2luZyA9IG1lYW4ocmlza3Rha2luZywgbmEucm0gPSBUUlVFKSwKICAgIG1lYW5fZ2VuZGVyID0gbWVhbihnZW5kZXIsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX2FnZSA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpLCAKICAgIG1lYW5fel9zY29yZV9hZ2UgPSBtZWFuKHpfc2NvcmVfYWdlLCBuYS5ybSA9IFRSVUUpLAogICkKCiMgTWVyZ2UgbWVhbiB2YWx1ZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgZGF0YXNldApjbGVhbmVkX2RhdGEgPC0gbWVyZ2UoY2xlYW5lZF9kYXRhLCBjb3VudHJ5X21lYW5zLCBieSA9ICJjb3VudHJ5IiwgYWxsLnggPSBUUlVFKQoKIyBEaXNwbGF5IHRoZSB1cGRhdGVkIGRhdGFzZXQKaGVhZChjbGVhbmVkX2RhdGEpCgpgYGAKCiNIYXJkc2hpcC1saXN0CmBgYHtyfQpleGNlbF9wYXRoIDwtICIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvSGFyZHNoaXAvSGFyZHNoaXAueGxzeCIKCmhhcmRzaGlwX3ZhbHVlcyA8LSByZWFkX2V4Y2VsKGV4Y2VsX3BhdGgpICMgUmVhZCBkYXRhIGZyb20gdGhlIEV4Y2VsIGZpbGUKCnByaW50KGNvbG5hbWVzKGNsZWFuZWRfZGF0YSkpICMgRGlzcGxheSBjb2x1bW4gbmFtZXMgaW4gY2xlYW5lZF9kYXRhCgpwcmludChjb2xuYW1lcyhoYXJkc2hpcF92YWx1ZXMpKSAjIERpc3BsYXkgY29sdW1uIG5hbWVzIGluIGhhcmRzaGlwX2RhdGEKCmNsZWFuZWRfZGF0YSA8LSBsZWZ0X2pvaW4oY2xlYW5lZF9kYXRhLCBoYXJkc2hpcF92YWx1ZXMsIGJ5ID0gImNvdW50cnkiKSAjIFBlcmZvcm0gdGhlIGxlZnRfam9pbiBvcGVyYXRpb24KCmhlYWQoY2xlYW5lZF9kYXRhKSAjIERpc3BsYXkgdGhlIHVwZGF0ZWQgZGF0YXNldApgYGAKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CmBgYHtyfQpncHNfY291bnRyeSA8LSBjbGVhbmVkX2RhdGEgJT4lCiAgc2VsZWN0KGNvdW50cnksIGlzb2NvZGUsIGlzb24sIG1lYW5fcmlza3Rha2luZywgbWVhbl9nZW5kZXIsIG1lYW5fYWdlLCBtZWFuX3pfc2NvcmVfYWdlLCBoYXJkc2hpcCkKZ3BzX2NvdW50cnkKYGBgCgojIENhbGN1bGF0ZSBtZWFuIHZhbHVlcyBmb3Igcmlza3Rha2luZywgZ2VuZGVyLCBhbmQgYWdlIHBlciBjb3VudHJ5CmBgYHtyfQojc2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBvZiBpbnRlcmVzdApncHNfY291bnRyeSA8LSBjbGVhbmVkX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXplKAogICAgaXNvY29kZSA9IGZpcnN0KGlzb2NvZGUpLAogICAgaXNvbiA9IGZpcnN0KGlzb24pLAogICAgbWVhbl9yaXNrdGFraW5nID0gbWVhbihyaXNrdGFraW5nLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl9nZW5kZXIgPSBtZWFuKGdlbmRlciwgbmEucm0gPSBUUlVFKSwKICAgIG1lYW5fYWdlID0gbWVhbihhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBoYXJkc2hpcCA9IGZpcnN0KGhhcmRzaGlwKQogICkgJT4lCiAgdW5ncm91cCgpCgpncHNfY291bnRyeQpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgRGVzY3JpcHRpdmUgCgojIE51bWJlciBvZiBjb3VydHJpZXMgYWZ0ZXIgZGF0YSBjbGVhbmluZwpgYGB7cn0KIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRyaWVzCm51bWJlcl9vZl9jb3VudHJpZXMgPC0gbGVuZ3RoKHVuaXF1ZShjbGVhbmVkX2RhdGEkY291bnRyeSkpCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRyaWVzCm51bWJlcl9vZl9jb3VudHJpZXMKYGBgCgojIyMjIyMjIyMjIwojIyMjIyMjIyMjCiMjIyMjIyMjIyMKI0NPREUgRk9SIFRIRSBQUkVTRU5UQVRJT04gCiMjIyMjIyMjIyMjCiMjIyMjIyMjIyMKIyMjIyMjIyMjIwoKIyBXb3JsZG1hcCBvZiB0aGUgcmVjb3JkZWQgY291bnRyaWVzCmBgYHtyfQp3b3JsZF9tYXAgPC0gbWFwX2RhdGEoIndvcmxkIikgIyBDcmVhdGUgYSB3b3JsZCBtYXAgd2l0aCBjb3VudHJ5IGJvcmRlcnMKCnJlY29yZGVkX2NvdW50cmllcyA8LSB1bmlxdWUoY2xlYW5lZF9kYXRhJGNvdW50cnkpICMgR2V0IHRoZSBsaXN0IG9mIHJlY29yZGVkIGNvdW50cmllcyBmcm9tIHlvdXIgY2xlYW5lZF9kYXRhCgp3b3JsZF9tYXAkcmVjb3JkZWQgPC0gaWZlbHNlKHdvcmxkX21hcCRyZWdpb24gJWluJSByZWNvcmRlZF9jb3VudHJpZXMsICJSZWNvcmRlZCIsICJOb3QgUmVjb3JkZWQiKSAjIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjb3VudHJ5IGhhcyBiZWVuIHJlY29yZGVkIG9yIG5vdAoKIyBQbG90IHRoZSB3b3JsZCBtYXAgd2l0aCByZWNvcmRlZCBjb3VudHJpZXMgaGlnaGxpZ2h0ZWQKZ2dwbG90KHdvcmxkX21hcCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwLCBmaWxsID0gcmVjb3JkZWQpKSArCiAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlJlY29yZGVkIiA9ICJkYXJrYmx1ZSIsICJOb3QgUmVjb3JkZWQiID0gImxpZ2h0Z3JleSIpLCBndWlkZSA9ICJub25lIikgKyAgIyBTZXQgZ3VpZGUgdG8gIm5vbmUiIHRvIHJlbW92ZSB0aGUgbGVnZW5kCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKHRpdGxlID0gIkdQUyIsIGZpbGwgPSAiU3RhdHVzIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICAjIFJlbW92ZSBsZWdlbmQgYW5kIGNlbnRlciB0aGUgdGl0bGUKCmBgYAojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBBbGwgYWJvdXQgdGhlIGFnZQpgYGB7cn0KIyBBZ2UgUmFuZ2UKYWdlX21pbiA8LSBtaW4oY2xlYW5lZF9kYXRhJGFnZSwgbmEucm0gPSBUUlVFKQphZ2VfbWF4IDwtIG1heChjbGVhbmVkX2RhdGEkYWdlLCBuYS5ybSA9IFRSVUUpCgojIEF2ZXJhZ2UgQWdlCmF2ZXJhZ2VfYWdlIDwtIG1lYW4oY2xlYW5lZF9kYXRhJGFnZSwgbmEucm0gPSBUUlVFKQoKIyBNZWRpYW4gQWdlCm1lZGlhbl9hZ2UgPC0gbWVkaWFuKGNsZWFuZWRfZGF0YSRhZ2UsIG5hLnJtID0gVFJVRSkKCiMgRGlzcGxheSB0aGUgYWdlIHN0YXRpc3RpY3MKY2F0KCJBZ2UgUmFuZ2U6ICIsIGFnZV9taW4sICIgdG8gIiwgYWdlX21heCwgIlxuIikKY2F0KCJBdmVyYWdlIEFnZTogIiwgYXZlcmFnZV9hZ2UsICJcbiIpCmNhdCgiTWVkaWFuIEFnZTogIiwgbWVkaWFuX2FnZSwgIlxuIikKYGBgCgojIE51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gZWFjaCBhZ2UgY2F0ZWdvcnkKYGBge3J9CiMgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBpbiBlYWNoIGFnZSBjYXRlZ29yeQphZ2VjYXRfY291bnRzIDwtIHRhYmxlKGNsZWFuZWRfZGF0YSRhZ2VjYXQpCgojIERpc3BsYXkgdGhlIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gdGhlIGFnZSBjYXRlZ29yaWVzCnByaW50KGFnZWNhdF9jb3VudHMpCmBgYAoKIyBCb3hwbG90IG9mIEFnZSBEaXN0cmlidXRpb24gcGVyIENvdW50cnkgCmBgYHtyfQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGFnZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuNSwgZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnMoeCA9ICJBZ2UiLCB5ID0gIkZyZXF1ZW5jeSIsIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBBZ2UgRGlzdHJpYnV0aW9ubiIpICsKICB0aGVtZV9taW5pbWFsKCkKCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gY291bnRyeSwgeSA9IGFnZSkpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEFnZSBwZXIgQ291bnRyeSIsIHggPSAiQ291bnRyeSIsIHkgPSAiQWdlIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQoKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBjb3VudHJ5LCB5ID0gcmlza3Rha2luZykpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIEFnZSBwZXIgQ291bnRyeSIsIHggPSAiQ291bnRyeSIsIHkgPSAiUmlza3Rha2luZyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgoKIyBBbGwgYWJvdXQgdGhlIGdlbmRlcgpgYGB7cn0KIyBDYWxjdWxhdGUgdGhlIGNvdW50cyBvZiBmZW1hbGVzIChnZW5kZXIgPSAxKSBhbmQgbWFsZXMgKGdlbmRlciA9IDIpCmdlbmRlcl9jb3VudHMgPC0gdGFibGUoY2xlYW5lZF9kYXRhJGdlbmRlcikKCiMgRGlzcGxheSB0aGUgY291bnRzCmNhdCgiTnVtYmVyIG9mIEZlbWFsZXM6ICIsIGdlbmRlcl9jb3VudHNbMV0sICJcbiIpCmNhdCgiTnVtYmVyIG9mIE1hbGVzOiAiLCBnZW5kZXJfY291bnRzWzJdLCAiXG4iKQpgYGAKCiMgVGFibGUgd2l0aCBjb3VudHJ5IGFuZCBnZW5kZXIKYGBge3J9CiMgQ3JlYXRlIGEgdGFibGUgdGhhdCBicmVha3MgZG93biB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBieSBjb3VudHJ5IGFuZCBnZW5kZXIKZ2VuZGVyX2J5X2NvdW50cnkgPC0geHRhYnMofiBjb3VudHJ5ICsgZ2VuZGVyLCBkYXRhID0gY2xlYW5lZF9kYXRhKQoKIyBSZW5hbWUgY29sdW1ucyBhbmQgcm93cyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5CmNvbG5hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSA8LSBjKCJGZW1hbGUiLCAiTWFsZSIpCnJvd25hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSA8LSB1bmlxdWUoY2xlYW5lZF9kYXRhJGNvdW50cnkpCgojIENhbGN1bGF0ZSB0aGUgdG90YWwgcGFydGljaXBhbnRzIGJ5IHN1bW1pbmcgdGhlIHJvd3MKdG90YWxfcGFydGljaXBhbnRzIDwtIHJvd1N1bXMoZ2VuZGVyX2J5X2NvdW50cnkpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCBjb3VudHJ5LCB0b3RhbCBwYXJ0aWNpcGFudHMsIGZlbWFsZSwgYW5kIG1hbGUKcmVzdWx0X3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgY291bnRyeSA9IHJvd25hbWVzKGdlbmRlcl9ieV9jb3VudHJ5KSwKICB0b3RhbF9wYXJ0aWNpcGFudHMgPSB0b3RhbF9wYXJ0aWNpcGFudHMsCiAgZmVtYWxlID0gZ2VuZGVyX2J5X2NvdW50cnlbLCAiRmVtYWxlIl0sCiAgbWFsZSA9IGdlbmRlcl9ieV9jb3VudHJ5WywgIk1hbGUiXQopCgojIERpc3BsYXkgdGhlIHJlc3VsdCB0YWJsZQpyZXN1bHRfdGFibGUKYGBgCiMgQW5hbHlzaXMgb2YgaXRlbSByaXNrdGFraW5nIApgYGB7cn0KIyBTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIHJpc2t0YWtpbmcKcmlza19zdW1tYXJ5IDwtIHN1bW1hcnkoY2xlYW5lZF9kYXRhJHJpc2t0YWtpbmcpCgojIEhpc3RvZ3JhbSBvZiByaXNrdGFraW5nCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gcmlza3Rha2luZykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmx1ZSIsIGFscGhhID0gMC43KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgUmlzay1UYWtpbmciLCB4ID0gIlJpc2stVGFraW5nIFNjb3JlIiwgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIEJveHBsb3Qgb2Ygcmlza3Rha2luZyBieSBnZW5kZXIKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBhcy5mYWN0b3IoZ2VuZGVyKSwgeSA9IHJpc2t0YWtpbmcsIGZpbGwgPSBhcy5mYWN0b3IoZ2VuZGVyKSkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBHZW5kZXIiLCB4ID0gIkdlbmRlciIsIHkgPSAiUmlzay1UYWtpbmcgU2NvcmUiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIwIiA9ICJtYWxlIiwgIjEiID0gImZlbWFsZSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKQoKIyBSaXNrIHZzIGFnZQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMocmlza3Rha2luZywgYWdlKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDAuMikgKyAgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCiMgQm94cGxvdCBvZiByaXNrdGFraW5nIGJ5IGFnZSBncm91cApjbGVhbmVkX2RhdGEkYWdlX2dyb3VwIDwtIGN1dChjbGVhbmVkX2RhdGEkYWdlLCBicmVha3MgPSBjKDAsIDI1LCAzNSwgNDUsIDU1LCBJbmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTgtMjUiLCAiMjYtMzUiLCAiMzYtNDUiLCAiNDYtNTUiLCAiNTYrIikpCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gYWdlX2dyb3VwLCB5ID0gcmlza3Rha2luZywgZmlsbCA9IGFnZV9ncm91cCkpICsKICBnZW9tX2JveHBsb3QoKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBBZ2UgR3JvdXAiLCB4ID0gIkFnZSBHcm91cCIsIHkgPSAiUmlzay1UYWtpbmcgU2NvcmUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKQoKIyBCb3hwbG90IG9mIHJpc2t0YWtpbmcgYnkgY291bnRyeQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGNvdW50cnksIHkgPSByaXNrdGFraW5nKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsdWUiKSArCiAgbGFicyh0aXRsZSA9ICJSaXNrLVRha2luZyBieSBDb3VudHJ5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJSaXNrLVRha2luZyBTY29yZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKYGBgCgojIyMjIyMjIyMjIwojIyMjIyMjIyMjIwojIyMjIyMjIyMjIwpGT1IgUFJFU0VOVEFUSU9OCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIAoKCiMgUmlzayB2cyBhZ2Ugd2l0aCBjb2xvci1jb2RlZCBnZW5kZXIgcGVyIENvdW50cnkKYGBge3J9CiMgU2thbGllcnVuZyBkZXMgWi1TY29yZXMgZsO8ciBkYXMgQWx0ZXIgYW5wYXNzZW4KY2xlYW5lZF9kYXRhJHpfc2NvcmVfYWdlX3NjYWxlZCA8LSAxNSAqIGNsZWFuZWRfZGF0YSR6X3Njb3JlX2FnZSArIDQyCgojIFJpc2sgdnMgYWdlIHdpdGggY29sb3ItY29kZWQgZ2VuZGVyIHBlciBDb3VudHJ5CmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh6X3Njb3JlX2FnZV9zY2FsZWQsIHJpc2t0YWtpbmcsIGNvbG9yID0gZmFjdG9yKGdlbmRlcikpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC4xKSArICAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDIsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsgICMgVmVydGlrYWxlIExpbmllIGbDvHIgZGVuIE1pdHRlbHdlcnQKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmx1ZSIsICJyZWQiKSwgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiKSkgKwogIGxhYnMoY29sb3IgPSAiR2VuZGVyIikgKwogIGdndGl0bGUoIlJpc2sgdnMgQWdlIEdQUyIpICsKICB4bGFiKCJBZ2UgKE1lYW4gPSA0MiwgU0QgPSAxNSkiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAsIGJ5ID0gMTUpLCBsaW1pdHMgPSBjKDAsIDEwMCkpICsgICMgQW5wYXNzdW5nIGRlciBJbnRlcnZhbGxlIGF1ZiBkZXIgWC1BY2hzZQogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCiMgUmlza3Rha2luZyB2cy4gaGFyZHNoaXAgYWNyb3NzIGNvdW50cmllcwpgYGB7cn0KIyBSaXNrdGFraW5nIHZzLiBIYXJkc2hpcCBhY3Jvc3MgY291bnRyaWVzIHdpdGggc3VtbWFyaXplZCBwb2ludHMKZ2dwbG90KGNsZWFuZWRfZGF0YSwgYWVzKHggPSBoYXJkc2hpcCwgeSA9IG1lYW5fcmlza3Rha2luZykpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGlzb2NvZGUpLCBzaXplID0gMykgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpc29jb2RlKSwgdmp1c3QgPSAtMC41LCBoanVzdCA9IDAuNSwgc2l6ZSA9IDMpICsKICBsYWJzKHRpdGxlID0gIlJpc2t0YWtpbmcgdnMuIEhhcmRzaGlwIGFjcm9zcyBDb3VudHJpZXMgR1BTIiwKICAgICAgIHggPSAiSGFyZHNoaXAiLCB5ID0gIlJpc2t0YWtpbmciKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKYGBge3J9CiMgUmlza3Rha2luZyB2cy4gSGFyZHNoaXAgYWNyb3NzIGNvdW50cmllcyB3aXRoIHN1bW1hcml6ZWQgcG9pbnRzCmdncGxvdChjbGVhbmVkX2RhdGEsIGFlcyh4ID0gaGFyZHNoaXAsIHkgPSBtZWFuX3pfc2NvcmVfYWdlKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gaXNvY29kZSksIHNpemUgPSAzKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGlzb2NvZGUpLCB2anVzdCA9IC0wLjUsIGhqdXN0ID0gMC41LCBzaXplID0gMykgKwogIGxhYnModGl0bGUgPSAiUmlza3Rha2luZyB2cy4gQWdlIGFjcm9zcyBDb3VudHJpZXMgR1BTIiwKICAgICAgIHggPSAiSGFyZHNoaXAiLCB5ID0gIkFnZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKCiMgU2NhdHRlcnBsb3Qgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhhcmRzaGlwIGluZGV4IGFuZCBhZ2UtZWZmZWN0IGVzdGltYXRlcwpgYGB7cn0KbW9kZWxfYWdlIDwtIGxtKGhhcmRzaGlwIH4gbWVhbl96X3Njb3JlX2FnZSwgZGF0YSA9IGNsZWFuZWRfZGF0YSkKbW9kZWxfZ2VuZGVyIDwtIGxtKGhhcmRzaGlwIH4gZ2VuZGVyLCBkYXRhID0gY2xlYW5lZF9kYXRhKQoKYGBgCgpgYGB7cn0KIyBDb2VmZmljaWVudHMgZm9yIGFnZS1lZmZlY3QKYWdlX2NvZWZmaWNpZW50cyA8LSBjb2VmKG1vZGVsX2FnZSkKCiMgQ29lZmZpY2llbnRzIGZvciBnZW5kZXItZWZmZWN0CmdlbmRlcl9jb2VmZmljaWVudHMgPC0gY29lZihtb2RlbF9nZW5kZXIpCgpgYGAKCmBgYHtyfQoKIyBTY2F0dGVycGxvdCBmb3IgYWdlLWVmZmVjdApnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IG1lYW5fel9zY29yZV9hZ2UsIHkgPSBoYXJkc2hpcCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiB4LCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgb2YgSGFyZHNoaXAgdnMgQWdlIiwKICAgICAgIHggPSAiQWdlIiwgeSA9ICJIYXJkc2hpcCIpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCiMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjCkxhdXJhIGhhcyB0byByZXdyaXRlIHRoZSBjb2RlIC0tPiBUYWJsZSBhbHJlYWR5IGluY2x1ZGVkIHdpdGggdGhlIGxtCgpgYGB7cn0KIyBGaXQgZGFzIE1vZGVsbCBtaXQgImFnZSIKbW9kZWxfZ2VuZGVyIDwtIGxtKHJpc2t0YWtpbmcgfiBhZ2UgKyBnZW5kZXIsIGRhdGEgPSBjbGVhbmVkX2RhdGEpCgojIEludGVyY2VwdCBhbmQgU2xvcGUgZm9yIGFnZQppbnRlcmNlcHRfYWdlIDwtIGNvZWYobW9kZWwpWyIoSW50ZXJjZXB0KSJdCnNsb3BlX2FnZSA8LSBjb2VmKG1vZGVsKVsiYWdlIl0KCnN1bW1hcnkobW9kZWwpCmBgYAoKIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMKTGF1cmEgaGFzIHRvIHJld3JpdGUgdGhlIGNvZGUgLS0+IFRhYmxlIGFscmVhZHkgaW5jbHVkZWQgd2l0aCB0aGUgbG0KCgojIENyZWF0ZSBhIHRhYmxlIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogY291bnRyeSwgaXNvY29kZSwgbiAoY291bnQgb2YgcGFydGljaXBhbnRzKSwgZmVtYWxlIHBlcmNlbnRhZ2UgKCUpLCBtZWFuIGFnZSwgYWdlIHJhbmdlLCBhbmQgcmlza3Rha2luZwoKIyMjIEZvdXIgbG91cCAKR3JvdXAgYnkgY291bnRyeQptdXRhdGUgaW50ZXJjZXB0IApydW4gYW5kIHNhdmUgaW50ZXJjZXB0IG1vZGVsIApgYGB7cn0KIyBHcm91cCB0aGUgZGF0YSBieSBjb3VudHJ5CnRhYmxlX2RhdGEgPC0gZ3BzX2RhdGEgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSwgaXNvY29kZSkgJT4lCiAgc3VtbWFyaXplKAogICAgbiA9IG4oKSwKICAgIGZlbWFsZV9wZXJjZW50YWdlID0gbWVhbihnZW5kZXIgPT0gMSkgKiAxMDAsCiAgICBtZWFuX2FnZSA9IG1lYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgYWdlX3JhbmdlID0gcGFzdGUobWluKGFnZSwgbmEucm0gPSBUUlVFKSwgIi0iLCBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpKSwKICAgIG1lYW5fcmlza3Rha2luZyA9IG1lYW4ocmlza3Rha2luZywgbmEucm0gPSBUUlVFKQogICkKCiMgSW50ZXJjZXB0IGFuZCBzbG9wZSBmb3IgYWdlCmludGVyY2VwdF9hZ2UgPC0gMC41NzU5NzAxCnNsb3BlX2FnZSA8LSAtMC4wMTM3OTAyCgojIEludGVyY2VwdCBhbmQgc2xvcGUgZm9yIGdlbmRlcgppbnRlcmNlcHRfZ2VuZGVyIDwtIDAuMTI0NjY2IApzbG9wZV9nZW5kZXIgPC0gLTAuMjI3MzM4IAoKIyBBZGQgdGhlIGludGVyY2VwdCBhbmQgc2xvcGUgaW5mb3JtYXRpb24gdG8gdGhlIHRhYmxlCnRhYmxlX2RhdGEgPC0gdGFibGVfZGF0YSAlPiUKICBtdXRhdGUoCiAgICBpbnRlcmNlcHRfYWdlID0gaW50ZXJjZXB0X2FnZSwKICAgIHNsb3BlX2FnZSA9IHNsb3BlX2FnZSwKICAgIGludGVyY2VwdF9nZW5kZXIgPSBpbnRlcmNlcHRfZ2VuZGVyLAogICAgc2xvcGVfZ2VuZGVyID0gc2xvcGVfZ2VuZGVyLAogICkKCiMgRGlzcGxheSB0aGUgdXBkYXRlZCB0YWJsZQp0YWJsZV9kYXRhCmBgYAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgoKI1ByZXBhcmluZyBmb3IgbGluZWFyIHJlZ3Jlc3Npb24KYGBge3J9CiMgQ2hlY2sgZm9yIG1pc3NpbmcgdmFsdWVzIGluICdDb3VudHJ5JyBhbmQgJ1Jpc2t0YWtpbmcnIGNvbHVtbnMKbWlzc2luZ19jb3VudHJ5IDwtIGFueU5BKGNsZWFuZWRfZGF0YSRjb3VudHJ5KQptaXNzaW5nX3Jpc2t0YWtpbmcgPC0gYW55TkEoY2xlYW5lZF9kYXRhJHJpc2t0YWtpbmcpCgojIFByaW50IHRoZSByZXN1bHRzCmNhdCgiTWlzc2luZyB2YWx1ZXMgaW4gJ0NvdW50cnknOiAiLCBtaXNzaW5nX2NvdW50cnksICJcbiIpCmNhdCgiTWlzc2luZyB2YWx1ZXMgaW4gJ1Jpc2t0YWtpbmcnOiAiLCBtaXNzaW5nX3Jpc2t0YWtpbmcsICJcbiIpCgpgYGAKCgpgYGB7cn0KIyBDbGVhbiB0aGUgZGF0YSBieSByZW1vdmluZyByZWNvcmRzIHdpdGggbWlzc2luZyB2YWx1ZXMKY2xlYW5lZF9kYXRhIDwtIGdwc19kYXRhICU+JQogIGRyb3BfbmEoY291bnRyeSwgcmlza3Rha2luZywgYWdlKQoKIyBTcGxpdCB0aGUgZGF0YSBieSBjb3VudHJ5IGFuZCBwZXJmb3JtIGxpbmVhciByZWdyZXNzaW9uIGZvciBlYWNoIGNvdW50cnkKcmVncmVzc2lvbl9yZXN1bHRzIDwtIGNsZWFuZWRfZGF0YSAlPiUKICBncm91cF9ieShjb3VudHJ5KSAlPiUKICBkbyhtb2RlbCA9IGxtKHJpc2t0YWtpbmcgfiBhZ2UsIGRhdGEgPSAuKSkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnRyeSA9IGZpcnN0KGNvdW50cnkpLAogICAgaW50ZXJjZXB0ID0gc3VtbWFyeShtb2RlbCkkY29lZmZpY2llbnRzWzFdLAogICAgc2xvcGUgPSBzdW1tYXJ5KG1vZGVsKSRjb2VmZmljaWVudHNbMl0sCiAgICByX3NxdWFyZWQgPSBzdW1tYXJ5KG1vZGVsKSRyLnNxdWFyZWQKICApCgojIERpc3BsYXkgcmVncmVzc2lvbiByZXN1bHRzIGZvciBlYWNoIGNvdW50cnkKcHJpbnQocmVncmVzc2lvbl9yZXN1bHRzKQpgYGAKCgojIGFuYWx5emUgdGhlIHJlc3VsdHMgYnkgdXNpbmcgIkJhbGtlbmRpYWdyYW1tIgojIyMjIyMgd2hhdCBkb2VzIDAgbWVhbj8gLy8gY2VudGVyZWQgYWdlID0gbWVhbiBhZ2Ugb2YgdGhlIHNhbXBsZQpgYGB7cn0KZ2dwbG90KGRhdGEgPSByZWdyZXNzaW9uX3Jlc3VsdHMsIGFlcyh4ID0gY291bnRyeSwgeSA9IGludGVyY2VwdCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJibHVlIikgKwogIGxhYnModGl0bGUgPSAiSW50ZXJjZXB0cyBmb3IgUmlza3Rha2luZyBieSBDb3VudHJ5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJJbnRlcmNlcHQgVmFsdWUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCiMgVmlldyB0aGUgY291bnRyaWVzIHdpdGggaW50ZXJjZXB0IHZhbHVlcyBvdmVyIDAuNzUKYGBge3J9CmhpZ2hfaW50ZXJjZXB0X2NvdW50cmllcyA8LSBzdWJzZXQocmVncmVzc2lvbl9yZXN1bHRzLCBpbnRlcmNlcHQgPiAwLjc1KQoKIyBWaWV3IHRoZSBjb3VudHJpZXMgd2l0aCBpbnRlcmNlcHQgdmFsdWVzIG92ZXIgMC43NQpwcmludChoaWdoX2ludGVyY2VwdF9jb3VudHJpZXMpCmBgYAoKCiMgU2NhdHRlcnBsb3RzIGZvciAnaGlnaF9pbnRlcmNlcHRfY291bnRyaWVzJyBjb250YWlucyB0aGUgdG9wIDE3IGNvdW50cmllcwpgYGB7cn0KIyBDcmVhdGUgc2NhdHRlcnBsb3RzIHdpdGggcmVncmVzc2lvbiBsaW5lcyBmb3IgY291bnRyaWVzIHdpdGggaW50ZXJjZXB0ID4gMC43NQpwbG90cyA8LSBsYXBwbHkoaGlnaF9pbnRlcmNlcHRfY291bnRyaWVzJGNvdW50cnksIGZ1bmN0aW9uKGNvdW50cnkpIHsKICBwIDwtIGdncGxvdChzdWJzZXQoY2xlYW5lZF9kYXRhLCBjb3VudHJ5ID09IGNvdW50cnkpLCBhZXMoeCA9IGFnZSwgeSA9IHJpc2t0YWtpbmcsIGNvbG9yID0gZmFjdG9yKGdlbmRlcikpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAwLjUpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSkgKwogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJMaW5lYXIgUmVncmVzc2lvbiBmb3IiLCBjb3VudHJ5KSwKICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiSW50ZXJjZXB0OiIsIHJvdW5kKGhpZ2hfaW50ZXJjZXB0X2NvdW50cmllcyRpbnRlcmNlcHRbaGlnaF9pbnRlcmNlcHRfY291bnRyaWVzJGNvdW50cnkgPT0gY291bnRyeV0sIDIpKSwKICAgICAgICAgY29sb3IgPSAiR2VuZGVyIikgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjAiID0gImJsdWUiLCAiMSIgPSAicmVkIiksIGxhYmVscyA9IGMoIk1hbGUiLCAiRmVtYWxlIikpCiAgcHJpbnQocCkKfSkKCiMgU2F2ZSB0aGUgcGxvdHMgaW4gYSBkaXJlY3RvcnkKZGlyLmNyZWF0ZSgiaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzIiwgc2hvd1dhcm5pbmdzID0gRkFMU0UpCnNldHdkKCJpbmRpdmlkdWFsX2NvdW50cnlfcGxvdHMiKQoKZm9yIChpIGluIHNlcV9hbG9uZyhwbG90cykpIHsKICBmaWxlbmFtZSA8LSBwYXN0ZTAoInBsb3RfIiwgaSwgIi5wbmciKQogIGdnc2F2ZShmaWxlbmFtZSwgcGxvdCA9IHBsb3RzW1tpXV0sIHdpZHRoID0gOCwgaGVpZ2h0ID0gNikKfQoKIyBTd2l0Y2ggYmFjayB0byB0aGUgb3JpZ2luYWwgd29ya2luZyBkaXJlY3RvcnkKc2V0d2QoIi4uIikKCnByaW50KCJJbmRpdmlkdWFsIHBsb3RzIGZvciBjb3VudHJpZXMgd2l0aCBpbnRlcmNlcHQgPiAwLjc1IGFyZSBzYXZlZCBpbiB0aGUgJ2luZGl2aWR1YWxfY291bnRyeV9wbG90cycgZGlyZWN0b3J5LiIpCgpgYGAKCiMgU2NhdHRlcnBsb3RzIGZvciAnaGlnaF9pbnRlcmNlcHRfY291bnRyaWVzJyBjb250YWlucyB0aGUgdG9wIDE3IGNvdW50cmllcwpgYGB7cn0KcGxvdHMgPC0gbGFwcGx5KGhpZ2hfaW50ZXJjZXB0X2NvdW50cmllcyRjb3VudHJ5LCBmdW5jdGlvbihjb3VudHJ5KSB7CiAgcCA8LSBnZ3Bsb3Qoc3Vic2V0KGNsZWFuZWRfZGF0YSwgY291bnRyeSA9PSBjb3VudHJ5KSwgYWVzKHggPSByYW5raW5nLngsIHkgPSByaXNrdGFraW5nLCBjb2xvciA9IGZhY3RvcihnZW5kZXIpKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMC41KSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHgsIHNlID0gRkFMU0UpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiTGluZWFyIFJlZ3Jlc3Npb24gZm9yIiwgY291bnRyeSksCiAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkludGVyY2VwdDoiLCByb3VuZChoaWdoX2ludGVyY2VwdF9jb3VudHJpZXMkaW50ZXJjZXB0W2hpZ2hfaW50ZXJjZXB0X2NvdW50cmllcyRjb3VudHJ5ID09IGNvdW50cnldLCAyKSksCiAgICAgICAgIGNvbG9yID0gIkdlbmRlciIpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIwIiA9ICJibHVlIiwgIjEiID0gInJlZCIpLCBsYWJlbHMgPSBjKCJNYWxlIiwgIkZlbWFsZSIpKQogIHByaW50KHApCn0pCgojIFNhdmUgdGhlIHBsb3RzIGluIGEgZGlyZWN0b3J5CmRpci5jcmVhdGUoImluZGl2aWR1YWxfY291bnRyeV9wbG90cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQpzZXR3ZCgiaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzIikKCmZvciAoaSBpbiBzZXFfYWxvbmcocGxvdHMpKSB7CiAgZmlsZW5hbWUgPC0gcGFzdGUwKCJwbG90XyIsIGksICIucG5nIikKICBnZ3NhdmUoZmlsZW5hbWUsIHBsb3QgPSBwbG90c1tbaV1dLCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCn0KCiMgU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCIuLiIpCgpwcmludCgiSW5kaXZpZHVhbCBwbG90cyBmb3IgY291bnRyaWVzIHdpdGggaW50ZXJjZXB0ID4gMC43NSBhcmUgc2F2ZWQgaW4gdGhlICdpbmRpdmlkdWFsX2NvdW50cnlfcGxvdHMnIGRpcmVjdG9yeS4iKQpgYGAKCiMgQ3JlYXRlIHNjYXR0ZXJwbG90cyB3aXRoIHJlZ3Jlc3Npb24gbGluZXMgZm9yIGluZGl2aWR1YWwgY291bnRyaWVzCmBgYHtyfQojIEV4YW1wbGVzIGZvciBjb3VudHJpZXMKcmVncmVzc2lvbl9yZXN1bHRzIDwtIGRhdGEuZnJhbWUoCiAgY291bnRyeSA9IGMoIkFsZ2VyaWEiLCAiQXJnZW50aW5hIiwgIkF1c3RyaWEiKSwKICBpbnRlcmNlcHQgPSBjKDAuOTIwNTM0MjIsIDAuNTE2OTg4MjIsIDAuNDI2MDY2ODQpLAogIHNsb3BlID0gYygtMC4wMTQ2NjQxODAxLCAtMC4wMTE1NTY5NjIzLCAtMC4wMTA4NzYzMDQyKSwKICByX3NxdWFyZWQgPSBjKDUuMjMyNTI5ZS0wMiwgNS42MzgyNzFlLTAyLCAzLjUzOTgxMGUtMDIJKQopCgojIENyZWF0ZSBzY2F0dGVycGxvdHMgd2l0aCByZWdyZXNzaW9uIGxpbmVzIGZvciBlYWNoIGNvdW50cnkKcGxvdHMgPC0gbGFwcGx5KHNlcV9sZW4obnJvdyhyZWdyZXNzaW9uX3Jlc3VsdHMpKSwgZnVuY3Rpb24oaSkgewogIGNvdW50cnkgPC0gcmVncmVzc2lvbl9yZXN1bHRzJGNvdW50cnlbaV0KICBpbnRlcmNlcHQgPC0gcmVncmVzc2lvbl9yZXN1bHRzJGludGVyY2VwdFtpXQogIHNsb3BlIDwtIHJlZ3Jlc3Npb25fcmVzdWx0cyRzbG9wZVtpXQogIHJfc3F1YXJlZCA8LSByZWdyZXNzaW9uX3Jlc3VsdHMkcl9zcXVhcmVkW2ldCiAgCiAgcCA8LSBnZ3Bsb3Qoc3Vic2V0KGNsZWFuZWRfZGF0YSwgY291bnRyeSA9PSBjb3VudHJ5KSwgYWVzKHggPSBhZ2UsIHkgPSByaXNrdGFraW5nKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgc2UgPSBGQUxTRSwgY29sb3IgPSAiYmx1ZSIpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiTGluZWFyIFJlZ3Jlc3Npb24gZm9yIiwgY291bnRyeSksCiAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIkludGVyY2VwdDoiLCByb3VuZChpbnRlcmNlcHQsIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xvcGU6Iiwgcm91bmQoc2xvcGUsIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiUi1zcXVhcmVkOiIsIHJvdW5kKHJfc3F1YXJlZCwgMikpKQogIHByaW50KHApCn0pCgojIFNhdmUgdGhlIHBsb3RzIGluIGEgZGlyZWN0b3J5CmRpci5jcmVhdGUoImluZGl2aWR1YWxfY291bnRyeV9wbG90cyIsIHNob3dXYXJuaW5ncyA9IEZBTFNFKQpzZXR3ZCgiaW5kaXZpZHVhbF9jb3VudHJ5X3Bsb3RzIikKCmZvciAoaSBpbiBzZXFfYWxvbmcocGxvdHMpKSB7CiAgZmlsZW5hbWUgPC0gcGFzdGUwKCJwbG90XyIsIGksICIucG5nIikKICBnZ3NhdmUoZmlsZW5hbWUsIHBsb3QgPSBwbG90c1tbaV1dLCB3aWR0aCA9IDgsIGhlaWdodCA9IDYpCn0KCiMgU3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHdvcmtpbmcgZGlyZWN0b3J5CnNldHdkKCIuLiIpCgpwcmludCgiSW5kaXZpZHVhbCBwbG90cyBhcmUgc2F2ZWQgaW4gdGhlICdpbmRpdmlkdWFsX2NvdW50cnlfcGxvdHMnIGRpcmVjdG9yeS4iKQpgYGAKCiMgU2NhdHRlcnBsb3Qgd2l0aCBpbmNsdWRlIGJvdGggaW5kaXZpZHVhbCBjb3VudHJ5IHJlZ3Jlc3Npb24gbGluZXMgYW5kIGFuIG92ZXJhbGwgcmVncmVzc2lvbiBsaW5lCmBgYHtyfQojIENhbGN1bGF0ZSB0aGUgb3ZlcmFsbCByZWdyZXNzaW9uIGxpbmUKb3ZlcmFsbF9sbSA8LSBsbShyaXNrdGFraW5nIH4gYWdlLCBkYXRhID0gY2xlYW5lZF9kYXRhKQoKIyBDcmVhdGUgYSBzY2F0dGVycGxvdCB3aXRoIHNlcGFyYXRlIHJlZ3Jlc3Npb24gbGluZXMgZm9yIGVhY2ggY291bnRyeQojIGFuZCBhbiBvdmVyYWxsIHJlZ3Jlc3Npb24gbGluZQpnZ3Bsb3QoY2xlYW5lZF9kYXRhLCBhZXMoeCA9IGFnZSwgeSA9IHJpc2t0YWtpbmcsIGNvbG9yID0gY291bnRyeSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAwLjUpICsgICAgICAgICAgICAgICAgICAgICAgIyBBZGp1c3QgcG9pbnQgc2l6ZQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIHNpemUgPSAwLjUpICsgIyBTb2xpZCBsaW5lIGZvciBpbmRpdmlkdWFsIGNvdW50cmllcwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGNvZWYob3ZlcmFsbF9sbSlbMV0sIHNsb3BlID0gY29lZihvdmVyYWxsX2xtKVsyXSwgCiAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKyAjIEFkZCB0aGUgb3ZlcmFsbCByZWdyZXNzaW9uIGxpbmUgaW4gcmVkCiAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdCB3aXRoIFJlZ3Jlc3Npb24gTGluZXMgZm9yIHJpc2t0YWtpbmcgYW5kIGFnZSBieSBDb3VudHJ5IiwgCiAgICAgICB4ID0gIkFnZSIsIHkgPSAiUmlza3Rha2luZyIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgICAgICAgICAgIyBNb3ZlIHRoZSBsZWdlbmQgYmVsb3cgdGhlIGdyYXBoCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjEsICJpbiIpKSAgIyBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGxlZ2VuZCBrZXkKYGBgCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgQ29tYmluZWQgTGlzdCBvZiBhbGwgMyBmaWxlcwoKIyBQcmVwYXJlIFdhdmUgNQpgYGB7cn0KIyBMb2FkIHRoZSBkYXRhCldWNV9kYXRhIDwtIHJlYWRSRFMoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9XVjZfZGF0YXNldF93YXZlXzVfNi9GMDAwMDc5NDQtV1Y1X0RhdGFfUl92MjAxODA5MTIucmRzIikgIyBEYXRhIG9mIFdhdmUgNQoKI3JlbmFtZSB0aGUgdmFyaWFibGVzCldWNV9kYXRhIDwtIFdWNV9kYXRhX2RmICU+JQogIHJlbmFtZShzZXggPSBWMjM1LCBhZ2UgPSBWMjM3LCBjb3VudHJ5ID0gVjIsIHdhdmUgPSBWMSwgcmlza3Rha2luZyA9IFY4NikKV1Y1X2RhdGEKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNV9kYXRhIDwtIFdWNV9kYXRhICU+JQogIHNlbGVjdChzZXgsIGFnZSwgY291bnRyeSwgd2F2ZSwgcmlza3Rha2luZykKV1Y1X2RhdGEKCiNkZWNvZGUgdGhlIGNvdW50cnkgbmFtZXMgCmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y1X2RhdGEkY291bnRyeV9sYWIgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y1X2RhdGEkY291bnRyeSwgY291bnRyeW5hbWVzJGNvZGUpXQp0YWJsZShXVjVfZGF0YSRjb3VudHJ5X2xhYikKV1Y1X2RhdGEKYGBgCgojIFByZXBhcmUgV2F2ZSA2CmBgYHtyfQojUmVhZCBEYXRhc2V0IChXYXZlIDYpCldWNl9kYXRhIDwtIGxvYWQoIi9Vc2Vycy9sYXVyYWJhenppZ2hlci9Eb2N1bWVudHMvR2l0SHViL3Jpc2tfd3ZzL2RhdGEvZGF0YXNldC9XVjZfZGF0YXNldF93YXZlXzVfNi9XVjZfRGF0YV9SX3YyMDIwMTExNy5yZGF0YSIpIApXVjZfZGF0YSA8LSBXVjZfRGF0YV9SX3YyMDIwMTExNyAKcHJpbnQoV1Y2X2RhdGEpCmBgYAoKI3JlbmFtZSB2YXJpYWJsZXMgaW4gV2F2ZSA2CmBgYHtyfQpXVjZfZGF0YSA8LSBXVjZfZGF0YSAlPiUKICByZW5hbWUod2F2ZSA9IFYxLCBzZXggPSBWMjQwLCBhZ2UgPSBWMjQyLGNvdW50cnkgPSBWMiwgcmlza3Rha2luZyA9IFY3NikKCiNzZWxlY3Qgb25seSB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0CldWNl9kYXRhIDwtIFdWNl9kYXRhICU+JQogIHNlbGVjdCh3YXZlLCBzZXgsIGFnZSwgY291bnRyeSwgc2V4LHJpc2t0YWtpbmcpCldWNl9kYXRhCmBgYAojZGVjb2RlIGRhcmFzZXQgKFdhdmUgNikKYGBge3J9CmNvdW50cnluYW1lcyA9IHJlYWQuY3N2KCIvVXNlcnMvbGF1cmFiYXp6aWdoZXIvRG9jdW1lbnRzL0dpdEh1Yi9yaXNrX3d2cy9kYXRhL2RhdGFzZXQvV1Y2X2RhdGFzZXRfd2F2ZV81XzYvY291bnRyeW5hbWVzLnR4dCIsIGhlYWRlcj1GQUxTRSxhcy5pcz1UUlVFKQpjb2xuYW1lcyhjb3VudHJ5bmFtZXMpID0gYygiY29kZSIsICJuYW1lIikKV1Y2X2RhdGEkY291bnRyeV9sYWIgPSBjb3VudHJ5bmFtZXMkbmFtZSBbbWF0Y2goV1Y2X2RhdGEkY291bnRyeSwgY291bnRyeW5hbWVzJGNvZGUpXQp0YWJsZShXVjZfZGF0YSRjb3VudHJ5X2xhYikKV1Y2X2RhdGEKYGBgCiMgUHJlcGFyZSBHUFMgZGF0YXNldCAoY2xlYW5lZF9kYXRhKQpgYGB7cn0KIyBSZW5hbWUgIkNvdW50cnkiIGluICJjb3VudHJ5X2xhYiIKcHJpbnQoY29sbmFtZXMoY2xlYW5lZF9kYXRhKSkKYGBgCgojY29tYmluZSB0aGUgMiBkYXRhc2V0IChXYXZlIDYgKyBXYXZlIDUpCmBgYHtyfQpXVjVfZGF0YQpXVjZfZGF0YQpkYXRhID0gcmJpbmQoV1Y1X2RhdGEsIFdWNl9kYXRhKQpkYXRhCgojbnVtYmVyIG9mIGNvdW50cmllcwoKbGVuZ3RoKHVuaXF1ZShkYXRhJGNvdW50cnlfbGFiKSkKYGBgCgoKIyBNZXJnZSB0aGUgZGF0YXNldHMgYmFzZWQgb24gY29tbW9uIHZhcmlhYmxlcwpgYGB7cn0KIyBGaW5kIGNvbW1vbiBjb3VudHJpZXMgYmV0d2VlbiB0aGUgdHdvIGRhdGFzZXRzCmNvbW1vbl9jb3VudHJpZXMgPC0gaW50ZXJzZWN0KGRhdGEkY291bnRyeV9sYWIsIGNsZWFuZWRfZGF0YSRjb3VudHJ5KQoKIyBEaXNwbGF5IHRoZSBjb21tb24gY291bnRyaWVzCnByaW50KGNvbW1vbl9jb3VudHJpZXMpCgpgYGAKCiMgRmluZCBjb3VudHJpZXMgaW4gImRhdGEiIGJ1dCBub3QgaW4gImNsZWFuZWRfZGF0YSIKYGBge3J9CmNvdW50cmllc19vbmx5X2luX2RhdGEgPC0gc2V0ZGlmZihkYXRhJGNvdW50cnlfbGFiLCBjbGVhbmVkX2RhdGEkY291bnRyeSkKCiMgRmluZCBjb3VudHJpZXMgaW4gImNsZWFuZWRfZGF0YSIgYnV0IG5vdCBpbiAiZGF0YSIKY291bnRyaWVzX29ubHlfaW5fY2xlYW5lZF9kYXRhIDwtIHNldGRpZmYoY2xlYW5lZF9kYXRhJGNvdW50cnksIGRhdGEkY291bnRyeV9sYWIpCgojIERpc3BsYXkgdGhlIHJlc3VsdHMKY2F0KCJDb3VudHJpZXMgb25seSBpbiAnZGF0YSc6IiwgY291bnRyaWVzX29ubHlfaW5fZGF0YSwgIlxuIikKY2F0KCJDb3VudHJpZXMgb25seSBpbiAnY2xlYW5lZF9kYXRhJzoiLCBjb3VudHJpZXNfb25seV9pbl9jbGVhbmVkX2RhdGEsICJcbiIpCmBgYAoKCgo=